package com.bms.zuul.filter;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.UserFilter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * @author thinknovo
 * @version 1.0
 * @description MyUserFilter.java
 * @date 2021/3/4 15:12
 */
public class MyUserFilter extends UserFilter {
    /**
     * 这个方法决定了是否需要用户登录
     */
    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
        // Remembered=false  Authenticated=false，代表用户没有登录，也没有缓存
        // Remembered=true  Authenticated=false，代表用户没有登录，但是有缓存
        // Remembered=false  Authenticated=true，代表用户当前登录成功，缓存有，但是在当前登录页面时不会记录
        // Remembered=true  Authenticated=true， 不会出现
        Subject subject = getSubject(request, response);
        System.out.println("MyUserFilter  -------------------------  isAccessAllowed isRemembered=" + subject.isRemembered());
        System.out.println("MyUserFilter  -------------------------  isAccessAllowed isAuthenticated=" + subject.isAuthenticated());
        /*
        如果isAuthenticated 为 true 代表用户手动输入用户名和密码登录
        如果isRemembered 为 true 代表用户直接通过RemenberMe功能登录
        按照官方说明isAuthenticated和isRememberd是互斥的，即任中一个为true，另外一个必为false
        如果希望在用户两种情况添加额外处理，可以写在下面if else中
         */
        if(subject.isAuthenticated()) {  // 登录状态  true   false true   false
            System.out.println("subject.isAuthenticated()=" + subject.isAuthenticated());
            // do work...
        }
        else if(subject.isRemembered()) {  // cookie缓存状态  false true    true  false
            System.out.println("subject.isRemembered()=" + subject.isRemembered());
            // do work...
        }
        //这个方法默认只返回 subject.isAuthenticated()   加上 subject.isRemembered() 目的是让它同时也兼容remember这种情况
        return subject.isAuthenticated() || subject.isRemembered();
    }

    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
        return super.onAccessDenied(request, response);
    }
}
